package lincen.javame.game.handhelddevice;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;


/**
 * 掌机游戏画布
 * @author 林岑
 * 
 * 一.此画布主要包括一下几方面内容:
 *    	01.主点阵集(此点阵集在画布生成时, 自动设置其大小(自动设置点阵集行数, 列数))
 *    	02.信息区
 *    		a)俄罗斯方块提示点阵集(即一个宽度高度都为4的点阵集)(在下文中均用PointNext表示)
 *    		b)得分提示信息
 *    		c)等级提示信息
 *    		d)暂停标记(本系统暂未提供此标记)
 * 
 * 二.此画布的接口:
 * 		01.获得主点阵列数        √
 * 		02.获得主点阵行数        √
 * 		03.获得PointNext点阵的列数 (默认为4 Infomation.COL)  √
 * 		04.获得PointNext点阵的行数 (默认为4 Infomation.ROW)  √
 * 
 * 		05.设置主点阵的显示:
 * 			a)通过传入boolean [] [] b 数组方法. 前置条件: b的行列数与主点阵行列相匹配  √
 * 			b)open(x, y)  /  close(x, y)       前置条件:x, y 必须在主点阵的行列范围内  (此方法暂不提供)
 * 		06.设置PointNext点阵的显示状态:
 * 			a)通过传入boolean [] [] b 数组方法. 前置条件: b的行列数与PointNext的行列数相匹配(4 x 4) 
 * 			b)open(x, y)  /  close(x, y)  前置条件:x, y 必须在PointNext点阵的行列范围内  (此方法暂不提供)
 * 		07.获得得分        √
 * 		08.获得等级        √
 * 		09.设置得分        √
 * 		10.设置等级        √
 */
@SuppressWarnings("serial")
public class HandHeldCanvas extends Canvas{

	/**
	 * 掌机游戏点阵控制器
	 * 内置:
	 * 		1.主点阵
	 * 		2.信息区
	 */
	private HandHeldGraphics handHG;

	/**
	 * 掌机游戏点阵控制器列数
	 */
	private int col;

	/**
	 * 掌机游戏点阵控制器行数
	 */
	private int row;

	/**
	 * 得分
	 */
	private int score;

	/**
	 * 等级
	 */
	private int level = 0;

	/**
	 * 新建一个掌机游戏画布,
	 * 默认禁用特殊键
	 */
	public HandHeldCanvas() {
		reset();
	}
	
	/**
	 * 设置主点阵集
	 * 前置条件: point的行数列数与row, col相匹配
	 * @param point
	 */
	public void setPointMain(final boolean [] [] point) {
		for (int y = 0; y < this.getRow(); y++) {
			for (int x = 0; x < this.getCol(); x++) {
				if (point [y] [x]) {
					this.handHG.open(x, y);
				} else {
					this.handHG.close(x, y);
				}
			}
		}
	}

	/**
	 * 设置主点阵集
	 * 前置条件: point的行数列数与row, col相匹配
	 * @param point
	 */
	public void setPointNext(final boolean [] [] point) {
		for (int y = 0; y < Infomation.ROW; y++) {
			for (int x = 0; x < Infomation.COL; x++) {
				if (point [y] [x]) {
					this.handHG.openNextPoint(x, y);
				} else {
					this.handHG.closeNextPoint(x, y);
				}
			}
		}
	}
	
	/**
	 * 获得主点阵行数
	 * @return
	 */
	public int getRow() {
		return this.row;
	}
	
	/**
	 * 获得主点阵列数
	 * @return
	 */
	public int getCol() {
		return this.col;
	}
	
	/**
	 * 获得当前等级
	 * 等级限制: 1-7级
	 */
	public int getLevel() {
		return this.level;
	}

	/**
	 * 获得当前得分
	 * @return
	 */
	public int getScore() {
		return this.score;
	}

	/**
	 * 设置等级
	 * 等级限制: 1-7级
	 * @param level
	 */
	public void setLevel(int level) {
		if(level > 7 || level < 1) {
			return;
		} else {
			this.level = level;
			this.handHG.setLevel(level);
		}
	}

	/**
	 * 设置得分
	 * @param score
	 */
	public void setScore(int score) {
		this.score = score;
		this.handHG.setScore(score);
	}


	/**
	 * 将点阵控制器绘制到缓冲区中
	 */
	public final void paintToBuffered() {
	
		//清空画布之前所画的元素
		fillBackground();
	
		//将hg点阵控制器绘制到画布缓冲区中
		this.handHG.paint(this.getGraphics());
	}

	/**
	 * 复位(重置)
	 * 即将画布设置为初始状态:
	 * 
	 *  1.根据画布大小, 重置所有点阵的大小;
	 *  2.清空所有点阵;
	 *  3.重置等级为0 ; 得分为0;
	 */
	private synchronized void reset() {
		this.col = this.getWidth() / Cells.CELLWIDTH - 7;
		this.row = this.getHeight() / Cells.CELLWIDTH - 2;
		this.handHG = null;
		this.handHG = new HandHeldGraphics(col, row, this.getWidth(), this.getHeight());
		this.setLevel(this.level);
		this.setScore(0);
	}

	/**
	 * 填充背景
	 * @param g
	 */
	private void fillBackground() {
		Graphics g = getGraphics();
		Color colorBefor = g.getColor();
		g.setColor(Cells.BACK_COLOR);
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(colorBefor);
	}
}
